package com.example.nettydemo.websocketserver;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.extern.slf4j.Slf4j;

import java.net.InetSocketAddress;

/**
 * Netty Reactor模型 -
 * 1.单线程模型:一个用户一个线程来处理，线程有极限
 * 2.多线程模型：加入线程池,线程池线程轮询执行任务
 * 3.主从多线程模型：俩个线程池，一个线程池接收请求，一个线程池处理IO（推荐，适用高并发环境）
 *
 * 以下代码为主从多线程模型
 * */
@Slf4j
public class NioWebSocketServer {
    public void init(InetSocketAddress socketAddress){
        NioEventLoopGroup boss=new NioEventLoopGroup();
        NioEventLoopGroup work=new NioEventLoopGroup();
        try {
            //1.创建netty服务器启动对象
            ServerBootstrap bootstrap=new ServerBootstrap();
            //2.初始化
            //指定使用的线程池
            bootstrap.group(boss,work);
            //指定netty通道类型
            bootstrap.channel(NioServerSocketChannel.class);
            // 指定通道初始化器用来加载当Channel收到事件消息后，
            // 如何进行业务处理
            bootstrap.childHandler(new NioWebSocketChannelInitializer());
            //3.绑定端口，以同步的方式启动
            Channel channel = bootstrap.bind(socketAddress).sync().channel();
            log.info("webSocket服务器启动成功："+channel);
            //4.等待服务关闭
            channel.closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
            log.info("运行出错："+e);
        }finally {
            boss.shutdownGracefully();
            work.shutdownGracefully();
            log.info("websocket服务器已关闭");
        }
    }

    public static void main(String[] args) {
        new NioWebSocketServer().init(new InetSocketAddress(
                Integer.parseInt("8889")));
    }
}
